//
//  WBStatusListViewModel.swift
//  CustomWeiBo
//
//  Created by laiqiang on 21/5/16.
//  Copyright © 2021年 laiqiang. All rights reserved.
//

import Foundation
import SDWebImage

//微博列表数据模型
/*
 父类的选择
 
 －类 需要“kvc” 或 字典转模型 就继承 于 NS Object
 - 如果只是封装一些代码逻辑(一些函数)，可以不用任何父类，轻量级
 －提示 oc 的一定要继承自NS Object
 －
 使命：负责微博的数据处理
 */

//上拉刷新 最大刷新 尝试次数
fileprivate let maxPullupTryTimes = 3

class WBStatusListViewModel {
    
    //改成单挑微博视图模型
    lazy var statusList = [WBStatusViewModel]()
    
    fileprivate var pullupErrorTimes = 0
    
    /// 加载微博数据列表
    ///
    /// - Parameter completion: 加载是否成功 / 是否有更多的上拉刷新
    func loadStatus(pullup:Bool,completion:@escaping (_ isSuccess: Bool,_ hasMorepull:Bool)->()) {
        
        //判断是否是上拉刷新，同时检查刷新错误
        if pullup && pullupErrorTimes > maxPullupTryTimes{
            
            completion(true,false)
            return
        }
        
        //since_id max_id,都是0，加载第一组数据
        //since_id !＝ 0，max_id ＝ 0 ，下拉时，第一条数据的ID不为0，最后一条数据id为0，加载since_id不为0的ID的之前的数组，
        //since_id ＝ 0，max_id !＝ 0，上拉时，最后一条微博的ID不为0，第一条微博的ID设置为0,加载max_id不为0的ID的之后的数组，
        let since_id = pullup ? 0 : (statusList.first?.status.id ?? 0)
        let max_id = !pullup ? 0 : (statusList.last?.status.id ?? 0)
        
        WBNetworkingManager.share.statusList(since_id: since_id,max_id: max_id) { (list, isSuccess) in
            
            if !isSuccess {
                completion(false, false)
                return
            }
            
            //声明可变数组
            var array = [WBStatusViewModel]()
            
            //遍历服务器返回的字典，逐一转成 “视图模型”,没有数据，使用空数组
            for dict in list ?? [] {
                
//                print("\(dict["pic_urls"])")
            
                guard let model = WBStatus.yy_model(with: dict) else{
                    continue
                }
                array.append(WBStatusViewModel(model: model))
            }
//            
            print("刷新到\(array.count) \(array)")
            
            // 拼接数据
            if pullup {
                //上拉刷新，将结果拼接到数组 尾部
                self.statusList += array
            }
            else{
                //下拉刷新，将结果拼接到数组 前面
                self.statusList = array + self.statusList
            }
            
            //判断上拉刷新的数据量,没有获取到数据,上拉请求错误加1
            if pullup && array.count == 0 {
                
                self.pullupErrorTimes += 1
                completion(isSuccess, false)
            }
            else{
                //缓存
                self.cacheSignleImage(list: array, finish: completion)
//                //完成 回调
//                completion(isSuccess,true)
            }
        }
    }
    //单张缓存，多张不缓存
    fileprivate func cacheSignleImage(list:[WBStatusViewModel],finish:@escaping (_ isSuccess: Bool,_ hasMorepull:Bool)->()){
        
        let group = DispatchGroup()

        var lenth = 0

        for vm in list {
            //判断数量
            if vm.picURLS?.count != 1 {
                continue
            }
            
            //需要缓存的
            guard let pic = vm.picURLS![0].thumbnail_pic,
                let url = URL.init(string: pic) else {
                continue
            }
            print("需要缓存的url＝\(url)")
            
            //下载图片 核心方法 自动存在沙河，存在url图片，不会发起网络请求
            //图片过大，后台处理
            
            group.enter()//入组
            SDWebImageManager.shared().downloadImage(with: url, options: [], progress: nil, completed: { (image, _, _, _, _) in
                
                if let image = image,
                    let data = UIImagePNGRepresentation(image){
                    //计算长度
                    lenth += data.count
                    
                    vm.updateSingleImageSize(image: image)
                }
                //出组
                group.leave()
            })
        }
        
        group.notify(queue: DispatchQueue.main) {
            
            print("图像缓存完成\(lenth/1024)")
            finish(true, true)
        };
    }
}
